package lambdasinaction.chap8.my;

import java.util.Arrays;
import java.util.List;

/**
 * 调试
 * 测试有问题的代码时，程序员的兵器库里有两个老式武器，分别是：
 * - 查看栈跟踪
 * - 输出日志
 *
 * 查看栈跟踪
 * 你的程序突然停止运行（比如突然抛出一个异常），这时你首先要调查程序在什么地方发生了异常以及为什么会发生该异常。
 * 这时栈帧就非常有用。程序的每次方法调用都会产生相应的调用信息，包括程序中方法调用的位置、该方法调用使用的参数、被调用方法的本地变量。
 * 这些信息被保存在栈帧上。
 * 程序失败时，你会得到它的栈跟踪，通过一个又一个栈帧，你可以了解程序失败时的概略信息。
 * 换句话说，通过这些你能得到程序失败时的方法调用列表。
 * 这些方法调用列表最终会帮助你发现问题出现的原因。
 *
 * Lambda 表达式和栈跟踪
 * 不幸的是，由于 Lambda 表达式没有名字，它的栈跟踪可能很难分析。
 * 在下面这段简单的代码中，我们刻意地引入了一些错误：
 *
 *
 * @author Fish
 * @since 0.0.1 2018/8/9 12:18
 */
public class MyDebugging {

  public static void main(String[] args) {
    List<Point> points = Arrays.asList(new Point(12, 2), null);
    points.stream().map(p -> p.getX()).forEach(System.out::println);

  }

  private static class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
      this.x = x;
      this.y = y;
    }

    public int getX() {
      return x;
    }

    public void setX(int x) {
      this.x = x;
    }

    public int getY() {
      return y;
    }

    public void setY(int y) {
      this.y = y;
    }
  }
}
